package gui.managedbeans;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import org.primefaces.context.RequestContext;

import Basicas.*;
import Exception.AlterarException;
import Exception.ApartamentoJaExisteException;
import Exception.InserirException;
import Exception.PernoiteNaoPermitidaException;
import Fachada.Fachada;

@ManagedBean
@SessionScoped
public class HospedagemBean {

	public HospedagemBean() {
		apartamentoSelecionado = new Apartamento();
		hospedagem = new Hospedagem();
		cliente = new Cliente();
		listaApartamentos = new ArrayList<Apartamento>();
		listaApartamentos = Fachada.getFachada().apartamentoListarTodos();
		listagem = Fachada.getFachada().hospedagemListarTodas();
		pagamento = new Pagamento();
	}

	@ManagedProperty("#{beanLogin.usuarioLogado}")
	private Usuario usuarioLogado;

	private Hospedagem hospedagem;
	private Cliente cliente;

	private List<Apartamento> listaApartamentos;
	private TipoApartamento tipoApartamentoEscolhido;
	private Apartamento apartamentoSelecionado;
	private List<TipoPagamento> tiposPagamentos;
	private Pagamento pagamento;
	List<Hospedagem>listagem = new ArrayList<Hospedagem>();
	
	private TipoOcupacao tipoOcupacaoEscolhido;
	@SuppressWarnings("unused")
	private List<TipoOcupacao> tiposOcupacoes;
	

	// usado para receber os tipos de apartamentos escolhidos no checkbox
	private List<TipoApartamento> tiposApEscolhidos;
	// usado para exibir os tipos de apartamentos
	@SuppressWarnings("unused")
	private List<TipoApartamento> tipoApartamentos;

	private List<SituacaoApartamento> situacaoApartamentosRscolhidos;

	@SuppressWarnings("unused")
	private SituacaoApartamento[] situacaoApartamentos;

	@SuppressWarnings("unused")
	private TipoVeiculo[] tiposDeVeiculos;

	public void limparApartamentoSelecionado(){
		
		apartamentoSelecionado = new Apartamento();
	}
	public void buscar() {

		listaApartamentos = Fachada.getFachada().apartamentoPesquisar(
				this.tiposApEscolhidos, this.situacaoApartamentosRscolhidos);

	}

	public String selecionarApartamento(Apartamento ap) {
		String retorno=null;
		this.apartamentoSelecionado = ap;
		//RequestContext context = RequestContext.getCurrentInstance();
		if (this.apartamentoSelecionado.getSituacaoApartamento() == SituacaoApartamento.Livre) {
			this.hospedagem = new Hospedagem();
			this.cliente = new Cliente();
			retorno = "/hospedagem/confirmarHospedagem?faces-redirect=true";
			//context.execute("tela1.show();");
		}
		if (this.apartamentoSelecionado.getSituacaoApartamento() == SituacaoApartamento.Ocupado) {
			this.hospedagem = Fachada.getFachada().obterHospedagemPorAp(this.apartamentoSelecionado, SituacaoApartamento.Ocupado);
			
			retorno = "/hospedagem/ocupadoHospedagem.xhtml?faces-redirect=true";
		}
							
		return retorno;
	}

	public String gerarHospedagem() {

		try {
			Fachada.getFachada().validarHospedagem(this.tipoOcupacaoEscolhido);
			
			this.apartamentoSelecionado.setSituacaoApartamento(SituacaoApartamento.Ocupado);
			Fachada.getFachada().apartamentoAlterar(apartamentoSelecionado);
			
			this.hospedagem.setTipoOcupacao(this.tipoOcupacaoEscolhido);
			this.hospedagem.setDataCriacao(new Date());
			this.hospedagem.setDataModificacao(new Date());
			this.hospedagem.setResponsavel(usuarioLogado);
			this.hospedagem.setApartamentoEscolhido(apartamentoSelecionado);
			Fachada.getFachada().realizarHospedagem(this.hospedagem,this.cliente);
			FacesContext.getCurrentInstance().addMessage("messages", new FacesMessage(FacesMessage.SEVERITY_INFO,"","Hospedagem realizada com sucesso"));
			limparApartamentoSelecionado();
			hospedagem = new Hospedagem();
			return  "/hospedagem/realizarHospedagem?faces-redirect=true";
		} catch (InserirException e) {
			FacesContext.getCurrentInstance().addMessage("messages", new FacesMessage(FacesMessage.SEVERITY_WARN,"",e.getMessage()));
			
			e.printStackTrace();
		} catch (PernoiteNaoPermitidaException e) {
			FacesContext.getCurrentInstance().addMessage("messages", new FacesMessage(FacesMessage.SEVERITY_WARN,e.getMessage(),""));
			
			e.printStackTrace();
		}catch (ApartamentoJaExisteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (AlterarException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return null;
	}
	
		
	public String visualizarPagamento(){
		this.pagamento = new Pagamento();
		this.pagamento.setHosp(this.hospedagem);
		this.pagamento.setValorApartamento(this.hospedagem.getValorServico());
		this.pagamento.setValorConsumo(this.hospedagem.getConsumo().getValorConsumo());
		this.pagamento.setValorAdicional(Fachada.getFachada().calcularValorAdicional(this.hospedagem.getTempoOcupacao().getSaidaPrevista()));
		this.pagamento.setValorTotal(Fachada.getFachada().fazerConta(this.pagamento));
		
		return  "/hospedagem/encerrarAdd.xhtml?faces-redirect=true";
	}
	
	public String cancelarSelecaoAp(){
		
		limparApartamentoSelecionado();
		return  "/hospedagem/realizarHospedagem?redirect=true";
	}

	public String pagar(){
		
		try {
					
			this.pagamento.setDataCriacao(new Date());
			this.pagamento.setDataModificacao(new Date());
			this.pagamento.setResponsavel(this.usuarioLogado);
			
			Fachada.getFachada().efetuarPagamento(this.pagamento);
			
						
			apartamentoSelecionado.setSituacaoApartamento(SituacaoApartamento.Livre);
			Fachada.getFachada().apartamentoAlterar(apartamentoSelecionado);
			
			
			
			FacesContext.getCurrentInstance().addMessage("messages", new FacesMessage(FacesMessage.SEVERITY_WARN,"Pagamento realizado com sucesso",null));
			
			return  "/hospedagem/realizarHospedagem?faces-redirect=true";
		} catch (InserirException e) {
			FacesContext.getCurrentInstance().addMessage("messages", new FacesMessage(FacesMessage.SEVERITY_WARN,"Sistema fora do AR",null));
			e.printStackTrace();
		} catch (AlterarException e) {
			FacesContext.getCurrentInstance().addMessage("messages", new FacesMessage(FacesMessage.SEVERITY_WARN,e.getMessage(),null));
			e.printStackTrace();
		} catch (ApartamentoJaExisteException e) {
			FacesContext.getCurrentInstance().addMessage("messages", new FacesMessage(FacesMessage.SEVERITY_WARN,e.getMessage(),null));
			e.printStackTrace();
		}
		return null;
	}
	
	
	

	
	public TipoOcupacao getTipoOcupacaoEscolhido() {
		return tipoOcupacaoEscolhido;
	}

	public void setTipoOcupacaoEscolhido(TipoOcupacao tipoOcupacaoEscolhido) {
		this.tipoOcupacaoEscolhido = tipoOcupacaoEscolhido;
	}

	public TipoOcupacao[] getTiposOcupacoes() {
		return TipoOcupacao.values();
	}

	public void setTiposOcupacoes(List<TipoOcupacao> tiposOcupacoes) {
		this.tiposOcupacoes = tiposOcupacoes;
	}

	public Usuario getUsuarioLogado() {
		return usuarioLogado;
	}

	public void setUsuarioLogado(Usuario usuarioLogado) {
		this.usuarioLogado = usuarioLogado;
	}

	public TipoVeiculo[] getTiposDeVeiculos() {
		return TipoVeiculo.values();
	}

	public void setTiposDeVeiculos(TipoVeiculo[] tiposDeVeiculos) {
		this.tiposDeVeiculos = tiposDeVeiculos;
	}

	public List<TipoApartamento> getTiposApEscolhidos() {
		return tiposApEscolhidos;
	}

	public void setTiposApEscolhidos(List<TipoApartamento> tiposApEscolhidos) {
		this.tiposApEscolhidos = tiposApEscolhidos;
	}

	public TipoApartamento[] getTipoApartamentos() {
		return TipoApartamento.values();
	}

	public void setTipoApartamentos(List<TipoApartamento> tipoApartamentos) {
		this.tipoApartamentos = tipoApartamentos;
	}

	public List<Apartamento> getListaApartamentos() {
		return listaApartamentos;
	}

	public void setListaApartamentos(List<Apartamento> listaApartamentos) {
		this.listaApartamentos = listaApartamentos;
	}

	public Apartamento getApartamentoSelecionado() {
		return apartamentoSelecionado;
	}

	public void setApartamentoSelecionado(Apartamento apartamentoSelecionado) {
		this.apartamentoSelecionado = apartamentoSelecionado;
	}

	public TipoApartamento getTipoApartamentoEscolhido() {
		return tipoApartamentoEscolhido;
	}

	public void setTipoApartamentoEscolhido(
			TipoApartamento tipoApartamentoEscolhido) {
		this.tipoApartamentoEscolhido = tipoApartamentoEscolhido;
	}

	public Hospedagem getHospedagem() {
		return hospedagem;
	}

	public void setHospedagem(Hospedagem hospedagem) {
		this.hospedagem = hospedagem;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public List<SituacaoApartamento> getSituacaoApartamentosRscolhidos() {
		return situacaoApartamentosRscolhidos;
	}

	public void setSituacaoApartamentosRscolhidos(
			List<SituacaoApartamento> situacaoApartamentosRscolhidos) {
		this.situacaoApartamentosRscolhidos = situacaoApartamentosRscolhidos;
	}

	public SituacaoApartamento[] getSituacaoApartamentos() {
		return SituacaoApartamento.values();
	}

	public void setSituacaoApartamentos(
			SituacaoApartamento[] situacaoApartamentos) {
		this.situacaoApartamentos = situacaoApartamentos;
	}

	public List<Hospedagem> getListagem() {
		return Fachada.getFachada().hospedagemListarTodas();
	}

	public void setListagem(List<Hospedagem> listagem) {
		this.listagem = listagem;
	}
	public Pagamento getPagamento() {
		return pagamento;
	}
	public void setPagamento(Pagamento pagamento) {
		this.pagamento = pagamento;
	}
	public TipoPagamento[] getTiposPagamentos() {
		return TipoPagamento.values();
	}
	public void setTiposPagamentos(List<TipoPagamento> tiposPagamentos) {
		this.tiposPagamentos = tiposPagamentos;
	}
	

}
